const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs-extra');
const dayjs = require('dayjs');

// 配置参数
const config = {
    entry: './srcService/service.ts',
    outputDir: './dist-service',
    minify: true,
    sourceMap: false,
    buildTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
    nodeEnv: "production",
    // 外部依赖 - 不打包进bundle的包
    externals: ['canvas', 'puppeteer']
};

// 构建命令
const buildCommand = [
    'ncc',
    'build',
    config.entry,
    '--out', config.outputDir,
    config.minify ? '--minify' : '',
    config.sourceMap ? '--source-map' : '',
    // 添加外部依赖参数
    ...config.externals.map(external => `--external ${external}`)
].filter(Boolean).join(' ');

console.log(`执行构建命令: ${buildCommand}`);

try {
    execSync(buildCommand, { stdio: 'inherit', shell: true });

    // === 新增文本替换逻辑开始 ===
    console.log(`构建时间: ${config.buildTime}`);
    // 查找输出目录中的主JS文件（通常是index.js）
    const outputJsPath = path.join(config.outputDir, 'index.js');
    // 读取文件内容
    let fileContent = fs.readFileSync(outputJsPath, 'utf8');
    // 替换process.env.BUILD_TIME为实际时间
    fileContent = fileContent.replace(/process\.env\.BUILD_TIME/g, `"${config.buildTime}"`);
    fileContent = fileContent.replace(/process\.env\.NODE_ENV/g, `"${config.nodeEnv}"`);
    // 写回修改后的内容
    fs.writeFileSync(outputJsPath, fileContent, 'utf8');
    // === 新增文本替换逻辑结束 ===

    // 复制 public 文件夹内容
    if (fs.existsSync('public')) {
        const publicFiles = fs.readdirSync('public');
        publicFiles.forEach(file => {
            const srcPath = path.join('public', file);
            const destPath = path.join(config.outputDir, file);
            fs.copySync(srcPath, destPath);
        });
    }

    // ../.env 文件 也复制到输出目录
    if (fs.existsSync('.env')) {
        fs.copySync('.env', path.join(config.outputDir, '.env'));
    }

    console.log('构建成功');
} catch (error) {
    console.error('构建失败:', error);
    process.exit(1);
}